/*
 * ©2009-2010 XELF
 * http://xelf.info
 */

using System;

namespace XELF.Framework {

	public partial struct Vector2 {
		/// <summary>
		/// クランプする。
		/// </summary>
		/// <param name="value">元の値</param>
		/// <param name="min">最小</param>
		/// <param name="max">最大</param>
		/// <param name="result">結果</param>
		public static void Clamp(ref Vector2 value, ref Vector2 min, ref Vector2 max, out Vector2 result) {
			result = new Vector2(
				Math.Min(Math.Max(value.X, min.X), max.X),
				Math.Min(Math.Max(value.Y, min.Y), max.Y));
		}
	}

	public partial struct Vector3 {
		/// <summary>
		/// クランプする。
		/// </summary>
		/// <param name="value">元の値</param>
		/// <param name="min">最小</param>
		/// <param name="max">最大</param>
		/// <param name="result">結果</param>
		public static void Clamp(ref Vector3 value, ref Vector3 min, ref Vector3 max, out Vector3 result) {
			result = new Vector3(
				Math.Min(Math.Max(value.X, min.X), max.X),
				Math.Min(Math.Max(value.Y, min.Y), max.Y),
				Math.Min(Math.Max(value.Z, min.Z), max.Z));
		}
	}

	public partial struct Vector4 {
		/// <summary>
		/// クランプする。
		/// </summary>
		/// <param name="value">元の値</param>
		/// <param name="min">最小</param>
		/// <param name="max">最大</param>
		/// <param name="result">結果</param>
		public static void Clamp(ref Vector4 value, ref Vector4 min, ref Vector4 max, out Vector4 result) {
			result = new Vector4(
				Math.Min(Math.Max(value.X, min.X), max.X),
				Math.Min(Math.Max(value.Y, min.Y), max.Y),
				Math.Min(Math.Max(value.Z, min.Z), max.Z),
				Math.Min(Math.Max(value.W, min.W), max.W));
		}
	}

}
